'use strict';
const bcrypt = require('bcryptjs')
const jwt = require('jsonwebtoken');
const secret = 'your-secret-key'; // 应该从环境变量获取

const {
  Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
  class User extends Model {
    /**
     * Helper method for defining associations.
     * This method is not a part of Sequelize lifecycle.
     * The `models/index` file will call this method automatically.
     */
    static associate(models) {
        // define association here
        models.User.hasMany(models.Course, { as: 'courses' })
        // 用户喜欢的课程有哪些
        models.User.belongsToMany(models.Course, {
            through: models.Like,
            foreignKey: 'userId',
            as: 'likeCourses'
        })
    }
  }
  User.init({
    email:{
        type: DataTypes.STRING,
        allowNull: false,
        validate: {
            notNull: {msg: '邮箱必须填写'},
            notEmpty: {msg: '邮箱不能为空'},
            isEmail: {msg: '邮箱格式不正确'},
            async isUnique(value){
                const user = await User.findOne({where: {email: value}})
                if(user){
                    throw new Error('邮箱已存在，请直接登录')
                }
            }
        }
    },
    username:{
        type: DataTypes.STRING,
        allowNull: false,
        validate: {
            notNull: {msg: '用户名必须填写'},
            notEmpty: {msg: '用户名不能为空'},
            len: {args: [2, 35], msg: '长度需要在 2 ~ 35 个字符之间。'},
            async isUnique(value){
                const user = await User.findOne({where: {username: value}})
                if(user){
                    throw new Error('用户名已存在。')
                }
            }
        }
    },
    nickname:{
        type: DataTypes.STRING,
        allowNull: false,
        validate: {
            notNull: {msg: '昵称必须填写'},
            notEmpty: {msg: '昵称不能为空'},
            len: {args: [2, 35], msg: '长度需要在 2 ~ 35 个字符之间。'}
        },
        
    },
    password:{
        type: DataTypes.STRING,
        allowNull: false,
        validate: {
            notNull: {msg: '密码必须填写'},
            notEmpty: {msg: '密码不能为空'},
        },
        set(value) {
            // 只在密码变更时加密（包括新建和更新）
            console.log('密码aaaaaaaaa--->',value)
            if (value.length>=6 && value.length <= 35) {
                const salt = bcrypt.genSaltSync(10);
                const hash = bcrypt.hashSync(value, salt);
                this.setDataValue('password', hash);
            } else {
                throw new Error('密码长度需要在 6 ~ 35 个字符之间。')
            }
        }
    },
    avatar:{
        type: DataTypes.STRING,
        // allowNull: false,
        validate: {
            // notNull: {msg: '图片必须填写'},
            // notEmpty: {msg: '图片不能为空'},
            isUrl: {msg: '图片地址不正确'},
        }
    },
    //   sex: DataTypes.TINYINT,
    sex:{
        type: DataTypes.TINYINT,
        allowNull: false,
        validate: {
            notNull: {msg: '性别必须填写'},
            notEmpty: {msg: '性别不能为空'},
            isIn: {args: [[0,1,2]], msg: '性别的值必须是，男性:0 女性:1 未知:2'}
        }
    },
    company: DataTypes.STRING,
    introduce: DataTypes.TEXT,
    // role: DataTypes.TINYINT
    role:{
        type: DataTypes.TINYINT,
        allowNull: false,
        validate: {
            notNull: {msg: '用户组必须填写'},
            notEmpty: {msg: '用户组不能为空'},
            isIn: {args: [[0, 100]], msg: '用户组的值必须是，普通用户:0 管理员:100 '}
        }
    }
  }, {
    sequelize,
    modelName: 'User',
  });
  return User;
};